/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 练习;

import org.junit.Test;

import java.io.File;
import java.io.IOException;

/**
 * @Description 练习
 * 1.
 * 利用 File 构造器， new 一个文件目录 file
 *      1)
 *      在 其中创建多个文件和目录
 *      2)
 *      编写 方法，实现删除 file 中指定文件 的操作
 * 2.
 *      判断 指定目录下是否有后缀名为 .jpg 的文件，如果有，就输出该文件 名称
 * 3.
 *      遍历 指定目录所有文件名称，包括子文件目录中的 文件。
 *      拓展
 *      1 ：并计算指定目录占用空间的大小
 *      拓展
 *      2 ：删除指定文件目录及其下的所有文件
 * @Author 俊昭
 * @Date 2022/4/23
 */
public class FileDemo {
/**
 * 遍历 指定目录所有文件名称，包括子文件目录中的 文件。
 * 并计算指定目录占用空间的大小
 * 删除指定文件目录及其下的所有文件见              同目录下"拓展"文件
 */
    public static void main(String[] args) {
        File f = new File("C:\\Users\\Junzhao\\IdeaProjects\\尚硅谷\\高级");

//        printSubFile(f);
        System.out.println(getDirectorySize(f));
    }

    /**
     * 遍历指定目录所有文件名称，包括子文件目录中的 文件。
     * @param dirName 需要遍历的目录名
     */
    public static void printSubFile(File dirName){
        if (dirName.isFile()) {
            System.out.println(dirName);
        } else {
            File[] all = dirName.listFiles();
            // 如果all[i]是文件，直接打印
            // 如果all[i]是目录，接着再获取它的下一级
            for (File f : all) {
                printSubFile(f);// 递归调用
            }
        }
    }
    /**
     * 计算指定目录占用空间的大小
     * @param file 要计算大小的文件目录
     * @return size 目录占用空间的大小
     */
    public static long getDirectorySize(File file) {
        // file是文件，那么直接返回file.length()
        // file是目录，把它的下一级的所有大小加起来就是它的总大小
        long size = 0;
        if (file.isFile()) {
            size += file.length();
        } else {
            File[] all = file.listFiles();// 获取file的下一级
            // 累加all[i]的大小
            for (File f : all) {
                size += getDirectorySize(f);// f的大小;
            }
        }
        return size;
    }

    /**
     * @description 输入两个File 进行删除如果不存在目录或文件报出异常
     * @param parent 父文件目录
     * @param delFile 要删除的文件或者文件目录
     * @author 俊昭
     * @date 2022/4/23
    */
    public static void del(File parent,File delFile){
        if (parent.exists() && parent.isDirectory()){
            if (parent.toString().equals(delFile.getParent()) ){
                delFile.delete();
            }else{
                throw new RuntimeException("不存在此文件或不是文件目录！");
            }

        }else{
            throw new RuntimeException("不存在此主目录或不是文件目录！");
        }


    }

    /**
     * 判断 指定目录下是否有后缀名为".jpg"的文件，如果有，就输出该文件 名称
     */
    @Test
    public void test003(){
        File file = new File("C:\\Users\\Junzhao\\IdeaProjects\\尚硅谷\\高级");

        String[] fileNames = file.list();
        for (String fileName : fileNames) {
//            System.out.println(fileName);
            if (fileName.endsWith(".jpg")){
                System.out.println("有jpg文件为：" + fileName);
                break;
            }
        }
        System.out.println("\n没找到");

    }

    @Test
    public void test002() throws IOException {
        File file0 = new File("C:\\Users\\Junzhao\\IOStream\\Exer\\file1.JSON");
        // 创建与file0同目录下的文件 ，文件名：haha.txt
        File file1 = new File(file0.getParent(),"haha.txt");
        file1.createNewFile();


    }

    @Test
    public void test001(){
        File file0 = new File("C:\\Users\\Junzhao\\IOStream\\Exer");
        File file1 = new File(file0,"\\file1.JSON");
        File file2 = new File(file0,"\\file2.JSON");
        File file3 = new File(file0,"\\file3.jpg");


        System.out.println(file0.isDirectory());

        try {
            // public boolean mkdirs() ：创建文件目录。如果上层文件目录不存在，一并创建
            file0.mkdirs();

            file1.createNewFile();
            file2.createNewFile();
            file3.createNewFile();

        } catch (IOException e) {
            e.printStackTrace();
        }

//        del(file0,file2);  感觉不完美




    }
}
